package com.cskaoyan.javase.object._3equals.notice;

/**
 * 重写equals方法的注意事项:
 *      1.排它性的实现,实际上是有两种选择的:
 *          a.getClass方法:
 *              是非常严格的排它性,完全不关注其它因素
 *              只要不是相同类型,都直接返回false
 *          b.instanceof校验
 *              语法:
 *              引用 instanceof 类名/接口名
 *              用来判断引用所指向的对象
 *              是否是后面类名/接口名的对象或者子类对象(如果是抽象类,接口,那么必然是子类对象)
 *              如果引用是null,语法结构直接返回false
 *              instanceof排它性校验,会更宽松一点,允许方法传入子类对象
 *
 *          总结:
 *          实际开发中,绝大多数情况下,还是优先使用getClass
 *          instanceof很少用
 *
 * @since 14:51
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Teacher t1 = new Teacher(100);
        Teacher t2 = new Teacher(100);
        System.out.println(t1.equals(t2));
        TeacherSon t3 = new TeacherSon(100);
        System.out.println(t1.equals(t3));
        System.out.println(t3.equals(t1));
    }
}

class Teacher {
    int id;

    public Teacher(int id) {
        this.id = id;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        // instanceof做排它性校验
        if (!(obj instanceof Teacher)) {
            // 说明obj指向的对象不是Teacher或者它的子类对象,或者是null引用
            return false;
        }
        /*if (obj == null || getClass() != obj.getClass()){
            return false;
        }*/
        // 比较属性的取值
        return this.id == ((Teacher) obj).id;
    }
}

class TeacherSon extends Teacher {
    public TeacherSon(int id) {
        super(id);
    }
}